#include <iostream>

using namespace std;

/*
 * 构造函数   类名() {}
 *  1、无返回值，不用写void
 *  2、构造函数名和类名相同
 *  3、可以有参数，可以发生重载
 *  4、程序在调用对象时会自动调用，且只会调用一次
 * 按照参数分为  有参构造  和  无参构造
 * 按照类型分为  普通构造  和  拷贝构造
 *
 * 析构函数    ~类名() {}
 *  1、无返回值，不用写void
 *  2、函数名与类名相同，前面加~
 *  3、不可以有参数，不可以发生重载
 *  4、程序在对象销毁前会自动调用，且只会调用一次
 */

class Test{
    int age;
public:   // 此处不写，默认是private权限，外部无法访问，无法在外面实例化对象
    Test() {
        cout << "Test无参构造函数" << endl;
    }

    Test(int a){
        age = a;
        cout << "Test有参构造函数" << endl;
    }

    ~Test() {
        cout << "Test析构函数" << endl;
    }

    Test(const Test &t) {  // 拷贝构造函数
        age = t.age;
        cout << "Test拷贝构造函数" << endl;
    }
};

void test01() {
    // 1、括号法
    Test t1;  // 默认构造函数调用   注：无参构造函数不能写成 Test t1(); 编译器会将其认为是函数的声明，不会生成对象
    Test t2(10);  // 有参构造函数调用
    Test t3(t2);  // 拷贝构造函数调用

    // 2、显示法
    Test t4;
    Test t5 = Test(11);
    Test t6 = Test(t5);

    Test(12); // 匿名对象   当前行执行结束后，系统会回收匿名对象
//    Test(t6);     // 注  不要用拷贝构造函数来初始化匿名对象,编译器会认为Test(t6); == Test t6; 对象已经声明过了

    // 3、隐式转换法
    Test t7 = 13;
    Test t8 = t7;
}

int main() {
    test01();

    return 0;
}
